/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ws.converter;

import entidade.persistencia.ReparoProdutoNumeroSerie;
import java.net.URI;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import entidade.persistencia.Produto;
import entidade.persistencia.ProdutoNumeroSerie;

/**
 *
 * @author victorinox
 */

@XmlRootElement(name = "reparoProdutoNumeroSerie")
public class ReparoProdutoNumeroSerieConverter {
    private ReparoProdutoNumeroSerie entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of ReparoProdutoNumeroSerieConverter */
    public ReparoProdutoNumeroSerieConverter() {
        entity = new ReparoProdutoNumeroSerie();
    }

    /**
     * Creates a new instance of ReparoProdutoNumeroSerieConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ReparoProdutoNumeroSerieConverter(ReparoProdutoNumeroSerie entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getReparoProdutoNumeroSerieId() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getProdutoId();
        getNumeroSerieId();
    }

    /**
     * Creates a new instance of ReparoProdutoNumeroSerieConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public ReparoProdutoNumeroSerieConverter(ReparoProdutoNumeroSerie entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for reparoProdutoNumeroSerieId.
     *
     * @return value for reparoProdutoNumeroSerieId
     */
    @XmlElement
    public Integer getReparoProdutoNumeroSerieId() {
        return (expandLevel > 0) ? entity.getReparoProdutoNumeroSerieId() : null;
    }

    /**
     * Setter for reparoProdutoNumeroSerieId.
     *
     * @param value the value to set
     */
    public void setReparoProdutoNumeroSerieId(Integer value) {
        entity.setReparoProdutoNumeroSerieId(value);
    }

    /**
     * Getter for observacao.
     *
     * @return value for observacao
     */
    @XmlElement
    public String getObservacao() {
        return (expandLevel > 0) ? entity.getObservacao() : null;
    }

    /**
     * Setter for observacao.
     *
     * @param value the value to set
     */
    public void setObservacao(String value) {
        entity.setObservacao(value);
    }

    /**
     * Getter for disponivel.
     *
     * @return value for disponivel
     */
    @XmlElement
    public Boolean getDisponivel() {
        return (expandLevel > 0) ? entity.getDisponivel() : null;
    }

    /**
     * Setter for disponivel.
     *
     * @param value the value to set
     */
    public void setDisponivel(Boolean value) {
        entity.setDisponivel(value);
    }

    /**
     * Getter for recuperada.
     *
     * @return value for recuperada
     */
    @XmlElement
    public Boolean getRecuperada() {
        return (expandLevel > 0) ? entity.getRecuperada() : null;
    }

    /**
     * Setter for recuperada.
     *
     * @param value the value to set
     */
    public void setRecuperada(Boolean value) {
        entity.setRecuperada(value);
    }

    /**
     * Getter for dataEntrada.
     *
     * @return value for dataEntrada
     */
    @XmlElement
    public Date getDataEntrada() {
        return (expandLevel > 0) ? entity.getDataEntrada() : null;
    }

    /**
     * Setter for dataEntrada.
     *
     * @param value the value to set
     */
    public void setDataEntrada(Date value) {
        entity.setDataEntrada(value);
    }

    /**
     * Getter for dataSaida.
     *
     * @return value for dataSaida
     */
    @XmlElement
    public Date getDataSaida() {
        return (expandLevel > 0) ? entity.getDataSaida() : null;
    }

    /**
     * Setter for dataSaida.
     *
     * @param value the value to set
     */
    public void setDataSaida(Date value) {
        entity.setDataSaida(value);
    }

    /**
     * Getter for produtoId.
     *
     * @return value for produtoId
     */
    @XmlElement
    public ProdutoConverter getProdutoId() {
        if (expandLevel > 0) {
            if (entity.getProdutoId() != null) {
                return new ProdutoConverter(entity.getProdutoId(), uri.resolve("produtoId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for produtoId.
     *
     * @param value the value to set
     */
    public void setProdutoId(ProdutoConverter value) {
        entity.setProdutoId((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for numeroSerieId.
     *
     * @return value for numeroSerieId
     */
    @XmlElement
    public ProdutoNumeroSerieConverter getNumeroSerieId() {
        if (expandLevel > 0) {
            if (entity.getNumeroSerieId() != null) {
                return new ProdutoNumeroSerieConverter(entity.getNumeroSerieId(), uri.resolve("numeroSerieId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for numeroSerieId.
     *
     * @param value the value to set
     */
    public void setNumeroSerieId(ProdutoNumeroSerieConverter value) {
        entity.setNumeroSerieId((value != null) ? value.getEntity() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the ReparoProdutoNumeroSerie entity.
     *
     * @return an entity
     */
    @XmlTransient
    public ReparoProdutoNumeroSerie getEntity() {
        if (entity.getReparoProdutoNumeroSerieId() == null) {
            ReparoProdutoNumeroSerieConverter converter = UriResolver.getInstance().resolve(ReparoProdutoNumeroSerieConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved ReparoProdutoNumeroSerie entity.
     *
     * @return an resolved entity
     */
    public ReparoProdutoNumeroSerie resolveEntity(EntityManager em) {
        Produto produtoId = entity.getProdutoId();
        if (produtoId != null) {
            entity.setProdutoId(em.getReference(Produto.class, produtoId.getProdutoId()));
        }
        ProdutoNumeroSerie numeroSerieId = entity.getNumeroSerieId();
        if (numeroSerieId != null) {
            entity.setNumeroSerieId(em.getReference(ProdutoNumeroSerie.class, numeroSerieId.getNumeroSerieId()));
        }
        return entity;
    }
}
